#pragma once

#include "noncopyable.h"
#include "Socket.h"
#include "Channel.h"

#include <functional>

class EventLoop;
class InetAddress;

// Acceptor 在 mainloop 里描述监听新用户连接的

class Acceptor : noncopyable
{
public:
    using NewConnectionCallback = std::function<void(int sockfd, const InetAddress& inetAddress)>;  // 参数是客户端连接fd、客户端地址信息

    Acceptor(EventLoop* loop, const InetAddress& listenAddr, bool reuseport);
    ~Acceptor();

    void setNewConnectionCallback(const NewConnectionCallback& cb) { newConnectionCallback_ = std::move(cb); }

    bool listenning() const { return listenning_; }

    void listen();

private:
    void handleRead();

    EventLoop* loop_;  // Acceptor用的就是用户定义的那个baseLoop，也就是mainLoop
    Socket acceptSocket_;  // 封装了监听新用户连接的fd
    Channel acceptChannel_;  // 封装了监听新用户连接的fd和对应回调等
    NewConnectionCallback newConnectionCallback_;  // 新连接到了做的事情（回调），绑定的是TcpServer::newConnection（TcpServer构造函数中绑定）
    bool listenning_;
};